Skip to main content

Javascript教程第六章:Set 和 WeakSet类型

Javascript教程第六章:Set 和 WeakSet类型

一.Set 和 WeakSet类型

1.Set类型

1.增加:

set.add()

2.删除:

set.delete()
set.clear()

3.改:

4.查:

set.has()

5.遍历

set.size()
set.values()
set.keys()
for offorEach(value,key,set)

1.Set:集合不能放重复元素

在Object类型中,属性名都会转换成字符串类型,而Set是严格类型约束,1是1 ,"1"是"1"

let set = new Set([1,2,3])
set.add(5)

let set = new Set("hdms");
console.log(set);
//输出如下:Set { 'h', 'd', 'm', 's' }

let set1 = new Set(["hdms","houdunren"])
console.log(set1.size);


2.遍历Set类型的方式

let myset = new Set(["hdms","houdunren.com"])
console.log(myset.values()); //返回可迭代对象

遍历方式:

(1)
set.forEach(function(value,key,set))
(2)
for(const iterator of set)

3.使用Set处理网站关键词

let input = document.getElementsByTagName("input")[0];
let obj = {
data: new Set(),
keyWord(keyword){
this.data.add(keyword)
},
show(){
let ul = document.querySelector("ul");
ul.innerHTML = '';
this.data.forEach(function(item){
ul.innerHTML += `<li>${item}</li>`;
})
}
}
input.addEventListener("blur",function(){
obj.keyWord(this.value);
obj.show()
})

4.Set实现并集交集差集的算法

let a = new Set([1,2,3,4])
let b = new Set([6,5,3,4])
//并集
let c = new Set([...a,...b])

//差集
console.log(
new Set([...a].filter(function(item){
return !b.has(item);
}))
);

5.WeakSet语法介绍

WeakSet(Object)必须为引用类型

操纵DOM元素

let nodes = new WeakSet()
document.querySelectorAll("div").forEach(functiom(item){
nodes.add(item)
})

6.引用类型的垃圾回收机制

同一个对象引用一次,内存中该对象的引用次数加一,当引用次数为零时,则变为垃圾

7.WeakSet弱引用类型

let hd = {name:"houdunren"}
let edu = hd;

此时我们引用了俩次该内存地址,引用次数为2

let set = new WeakSet();
set.add(hd)

再将该内存地址的数据加入WeakSet类型中,引用次数不会增加,我们将这种方式成为弱引用类型,Set的迭代方法等等都无法使用

console.log(set);

如果此时我们将hd和edu清空,那么该内存地址的数据将会被当作垃圾处理
hd = null;
edu = null;

而此时WeakSet中还是会认为有数据

8.todo列表中使用 WeakSet

使用WeakSet保存DOM中的NodeList

class todo {
constructor(){
this.items = document.querySelectorAll('ul>li')
// console.log(this.items);
let list = new WeakSet()
this.items.forEach(item => list.add(item))
}
addEvent(){
this.items.forEach(item => {
let a = item.querySelector('a');
a.addEventListener('click',function(e){
const parentNode = e.target.parentElement;
parentNode.classList.add("remove")
})
})
}
run(){
this.addEvent();
}

}
new todo().run();